package solutions.ferpa.ztest.intf;

import br.com.telescope.adsrt.dom.DomDate;
import br.com.telescope.adsrt.dom.DomFlag;
import br.com.telescope.adsrt.lib.*;
import br.com.telescope.t2.ServiceModel;
import br.com.telescope.t2.exception.ApplicationRuntimeException;
import br.com.telescope.t2.feature.CustomFeature;
import br.com.telescope.t2.feature.MethodFeature;
import br.com.telescope.util.JdbcUtil;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import solutions.ferpa.ztest.ent.*;

/**
 * Exportação de Logs.
 * <p>
 * Exportar os arquivos do log, de determinado período, para arquivos 
 * texto.
 * <P>
 * 
 * <P>
 * Telescope origin: RTLOG.UTL_LOGS_EXPORT
 * <P>
 * @author TELESCOPE - Build task T2 Web Interface Generator
 * <P>
 * @version 0.1
 */
public class UtlLogsExport extends ServiceModel {
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    public static final String GLOBAL_NAME = "RTLOG.UTL_LOGS_EXPORT";
    
    @Override
    public String globalName() {
        return GLOBAL_NAME;
    }
    
    {
        setTitle("Exportação de Logs");
    }
    
    
    // Record items
    private DomDate aUnDataFinal;
    private DomDate aUnDataInicial;
    private DomFlag aUnExcluirRegistrosExportados;
    
    // Query items
    
    @Override
    public void initAttributes() {
        
        aUnDataFinal = new DomDate();
        aUnDataFinal.context(ctx).name("UN_DATA_FINAL").label("Data final").unbound(true);
        
        aUnDataInicial = new DomDate();
        aUnDataInicial.context(ctx).name("UN_DATA_INICIAL").label("Data inicial").unbound(true);
        
        aUnExcluirRegistrosExportados = new DomFlag();
        aUnExcluirRegistrosExportados.context(ctx).name("UN_EXCLUIR_REGISTROS_EXPORTADOS").label("Excluir registros exportados").unbound(true);
        aUnExcluirRegistrosExportados.setDefaultValue("S");
        
    }
    
    @Override
    public String getDefaultOrderBy() {
        return "";
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="EXPORTA_LOGS">
    public class FExportaLogs extends CustomFeature {
        
        @Override
        public void initForm() {
            aUnDataInicial.setOptional(false);
            addField(aUnDataInicial, "rqd");
            aUnDataFinal.setOptional(false);
            addField(aUnDataFinal, "rqd");
            aUnExcluirRegistrosExportados.setOptional(false);
            addField(aUnExcluirRegistrosExportados, "rqd");
        }
        
        @Override
        public void onAction() {
            addSubmit(getFeature("EXPORTA_DADOS_LOGS")).label("Exporta dados dos logs");
        }
        
        {
            setFeatureName("EXPORTA_LOGS");
            setTitle("Exporta logs para arquivo texto");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="EXPORTA_DADOS_LOGS">
    public class FExportaDadosLogs extends MethodFeature {
        
        @Override
        public void run() {
            preRun();
            try {
                exportaDadosLogs();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        {
            setFeatureName("EXPORTA_DADOS_LOGS");
            setTitle("Exporta dados dos logs");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="initFeatures">
    
    @Override
    protected void initFeatures() {
        addFeature(new FExportaLogs());
        addFeature(new FExportaDadosLogs());
        super.initFeatures();
    }
    
    @Override
    public String getDefaultFeature() {
        return "EXPORTA_LOGS";
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Getters and Setters">
    
    public java.sql.Date getUnDataFinal() {
        return aUnDataFinal.getValue();
    }
    
    public void setUnDataFinal(java.sql.Date value) {
        this.aUnDataFinal.setValue(value);
    }
    
    public java.sql.Date getUnDataInicial() {
        return aUnDataInicial.getValue();
    }
    
    public void setUnDataInicial(java.sql.Date value) {
        this.aUnDataInicial.setValue(value);
    }
    
    public String getUnExcluirRegistrosExportados() {
        return aUnExcluirRegistrosExportados.getValue();
    }
    
    public void setUnExcluirRegistrosExportados(String value) {
        this.aUnExcluirRegistrosExportados.setValue(value);
    }
    // </editor-fold>
    
    /**
     * Exporta dados dos logs.
     * <p>
     * Exporta o resultado da busca dos logs para arquivo texto.
     */
    private void exportaDadosLogs() throws AdsException {
        // <user-code id="806895" parentId="363055" hashcode="3962da69" length="1899">
        // import br.com.telescope.util.JdbcUtil;
        // import java.io.FileWriter;
        
        String pasta = ctx.getPreference("RTADM.LOGS_FOLDER");
        if (pasta == null || pasta.length() == 0) {
            throw new AdsException("RTADM.LOGS_FOLDER_NOT_CONFIGURED",
                    AdsException.ERROR, "A pasta usada para salvar os logs exportados" +
                    " não foi configurada. Favor configurar a preferencia " +
                    " RTADM.LOGS_FOLDER");
        }
        
        aUnDataFinal.getHtmlParameter();
        aUnDataInicial.getHtmlParameter();
        aUnExcluirRegistrosExportados.getHtmlParameter();
        
        SimpleDateFormat dt = new SimpleDateFormat("yyyyMMdd");
        
        String d1 = dt.format(aUnDataInicial.getValue());
        String d2 = dt.format(aUnDataFinal.getValue());
        
        String nome = d1 + "_" + d2 + ".log";
        
        beginTransaction();
        
        try {
            FileWriter file = new FileWriter(pasta + nome);
            EntLogs log = new EntLogs(ctx);
            log.filterBy().between(log.getDataHora(), 
                    aUnDataInicial.getValue(), 
                    aUnDataFinal.getValue());
            while (log.next()) {
                file.write(log.toTXT() + "\n");
            }
            file.close();
            log.close();
            // Excluir os registros quando selecionado
            if (aUnExcluirRegistrosExportados.getValue().equals("S")) {
                PreparedStatement ps = null;
                ResultSet rs = null;
                try {
                    ps = ctx.getConnection().prepareStatement("delete" +
                            " from LOGS" +
                            " where DATA_HORA between ? and ?");
                    ps.setDate(1, aUnDataInicial.getValue());
                    ps.setDate(2, aUnDataFinal.getValue());
                    ps.executeUpdate();
                } catch (SQLException ex) {
                    throw new AdsException(ex);
                } finally {
                    JdbcUtil.close(ps, rs);
                }
            }
        } catch (IOException ex) {
            throw new AdsException(ex);
        }
        ctx.showSuccess("Log exportado com sucesso!");
        endTransaction();
        // </user-code>
    }
}
